// src/utils/request.ts

import axios, { type AxiosInstance, type InternalAxiosRequestConfig, type AxiosResponse } from "axios";
import { ElMessage } from "element-plus";
import type { ApiResponse } from "../type/api";

/**
 * 创建 axios 实例
 * 统一配置请求的基础设置,包括 baseURL、超时时间、请求头等
 */
// src/utils/request.ts
const request: AxiosInstance = axios.create({
  baseURL: "/api", // 所有请求都将使用这个基础路径
  timeout: 10000,
  headers: {
    "Content-Type": "application/json;charset=UTF-8",
  },
});

/**
 * 请求拦截器
 */
request.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    const token = localStorage.getItem("token");
    if (token && config.headers) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    console.error("请求错误:", error);
    return Promise.reject(error);
  }
);

/**
 * 响应拦截器
 * 在收到响应后执行,统一处理业务状态码和HTTP错误
 */
request.interceptors.response.use(
  (response: AxiosResponse<ApiResponse>) => {
    // 解构出后端返回的业务数据
    const res = response.data;

    // 检查业务状态码，同时判断 0 和 200
    if (res.code !== 0 && res.code !== 200) {
      // 如果 code 不为 0 且不为 200，表示业务处理失败，显示错误信息
      ElMessage.error(res.msg || "业务处理失败");
      // 抛出异常，以便在调用方（如 Home.vue）的 catch 块中捕获
      return Promise.reject(new Error(res.msg || "业务处理失败"));
    }

    // 业务成功，直接返回数据
    return response;
  },
  (error) => {
    // 处理 HTTP 错误状态码和网络错误
    let message = "请求失败";
    if (error.response) {
      switch (error.response.status) {
        case 401:
          message = "未授权,请重新登录";
          localStorage.removeItem("token");
          localStorage.removeItem("userPhone");
          localStorage.removeItem("loginTime");
          window.location.href = "/login";
          break;
        case 403:
          message = "拒绝访问";
          break;
        case 404:
          message = "请求的资源不存在";
          break;
        case 500:
          message = "服务器内部错误";
          break;
        case 502:
          message = "网关错误";
          break;
        case 503:
          message = "服务不可用";
          break;
        case 504:
          message = "网关超时";
          break;
        default:
          message = `请求失败: ${error.response.status}`;
      }
    } else if (error.request) {
      message = "网络连接失败";
    }

    console.error("响应错误:", error);
    ElMessage.error(message);
    return Promise.reject(error);
  }
);

// 导出配置好的 axios 实例
export default request;
